﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace GENERIC.Respository.Interfaces
{
    /// <summary>
    /// Intetrface de base du repository
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public interface IRepository<TEntity> where TEntity : new()
    {

        /// <summary>
        /// Insertion d'une entité
        /// </summary>
        /// <param name="entity">Entité à insérer</param>
        void Insert(TEntity entity);

        /// <summary>
        /// Mise à jour d'une entité
        /// </summary>
        /// <param name="entity">Entité à mettre à jour</param>
        void Update(TEntity entity);

        /// <summary>
        /// Suppression d'une entité
        /// </summary>
        /// <param name="entity">Entité à mettre à jour</param>
        void Delete(TEntity entity);

        /// <summary>
        /// Obtient un ensemble d'entités
        /// </summary>
        /// <returns>un ensemble d'entités</returns>
        IQueryable<TEntity> Get();

        /// <summary>
        /// Obtenir une collection d'entité
        /// </summary>
        /// <param name="expression">Critère de séléction</param>
        /// <returns>Collection d'entités</returns>
        IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> expression);

        /// <summary>
        /// Obtenir une collection d'entité en asynchrone
        /// </summary>
        /// <param name="expression">Critère de séléction</param>
        /// <param name="callback">Collection d'entité</param>
        /// <returns>Résultat</returns>
        bool GetAsync(Expression<Func<TEntity, bool>> expression, Action<AsyncResponse, IQueryable<TEntity>> callback);

    }
}
